﻿namespace Core.Contracts.Interfaces
{
    using Enums;

    /// <summary>
    /// Feature interface contract
    /// </summary>
    public interface IFeature<T>
    {
        /// <summary>
        /// Obtains the feature group
        /// </summary>
        FeatureGroupsEnum FeatureGroup { get; }
        /// <summary>
        /// Obtains the feature type
        /// </summary>
        FeaturesEnum FeatureType { get;  }
        /// <summary>
        /// Obtains or defines the feature value
        /// </summary>
        T Value { get;}
        /// <summary>
        /// Obtains the feature unit
        /// </summary>
        string Unit { get;  }
        /// <summary>
        /// Determines if the feature value is rounded
        /// </summary>
        bool IsRounded { get; }
        /// <summary>
        /// Obtains or defines the Modified feature value
        /// </summary>
        T ModifiedValue { get; set; }
        /// <summary>
        /// Calculate the modified feature value
        /// </summary>
        void SetModifiedValue(IAgent agent, IRobot robot);
        /// <summary>
        /// Determines if the feature value has been modified
        /// </summary>
        bool IsModified { get; }
        /// <summary>
        /// Obtains the feature displayed name
        /// </summary>
        string Name { get; }
    }
}